<?php

namespace App\Services\Pay;

class ResultVo
{

//000000表示查询成功/交易成功， 222222支付中/等待授权/交易未知，006668 订单已撤销，000010“该订单已关闭，请重新下单”，更多状态请看上面的错误码表
    const GtxyResponseCodeMap = [
        "ok" => "000000",
        "paying" => "222222",
        "payfail" => "555555",
        "paycancel" => "006668",
        "payclose" => "000010",

        "order_not_exists" => "121336",
        "refunding" => "121338",
        "refundfail" => "333333",
        "refundtoday" => "000002"
    ];


    const GtxyResponseMap = [
        "success" => [
            "pay_status" => "",
            "out_trade_no" => "",
            "order_no" => "",//orderNo国通平台订单号
            'trade_no' => "",//torderNo 微信/支付宝（目的通道流水号），银联（官方订单号）可用于退款
            "agetId" => "",//机构编号
            "custFee" => "", //商户交易实收手续费
            "oldFee" => "",//应收手续费
            "pay_time" => "",//订单完成时间 yyyyMMddHHmmss
            "cardType" => "",//01借记卡、 02贷记卡、03其他
        ],
    ];
//'status' => '1',
//'pay_status' => 2,
//'message' => '正在支付',
//'data' => [
//'out_trade_no' => $out_trade_no,
//'ways_type' => $ways_type,
//'ways_source' => $ways_source,
//'total_amount' => $total_amount,
//'store_id' => $store_id,
//'store_name' => $store_name,
//'config_id' => $config_id


    /**
     * @var String
     */
    protected $code = 0;
    /**
     * @var String
     */
    protected $msg = "";

    /**
     * @var T
     */
    protected $data;


    //pay : 000000表示成功；222222表示支付中/等待授权/交易未知；其它表示失败。如果是返回222222，要调用支付查询接口查询最终的支付结果，建议查询3次。每次间隔10秒
    public $codeMap = [
        "ok" => 1,
        "failed" => 2
    ];

//'status' => '1',
//'pay_status' => 1,
//'message' => '支付成功',
//'data' => [
//'out_trade_no' => $out_trade_no,
//'ways_type' => $ways_type,
//'total_amount' => $total_amount,
//'store_id' => $store_id,
//'store_name' => $store_name,
//'config_id' => $config_id,
//'pay_time' => $pay_time,
//'trade_no' => $trade_no,
//'qwx_no' => $qwxNo,
//'ways_source' => $ways_source
//]


    protected function ResultVo()
    {
    }

    private static $instance = null;

    protected static function get(): ResultVo
    {
        if (empty(self::$instance)) {
            $ovj = new ResultVo();
            self::$instance = $ovj;
        } else {
            $ovj = self::$instance;
        }
        return $ovj;
    }

    public static function code(string $code = "ok"): ResultVo
    {
        $resultVo = self::get();
        $resultVo->code = $resultVo->codeMap[$code];
        return $resultVo;
    }

    public static function msg(string $msg = ""): ResultVo
    {
        $resultVo = self::get();
        $resultVo->msg = $msg;
        return $resultVo;
    }

    public static function data($data): ResultVo
    {
        $resultVo = self::get();
        $resultVo->data = $data;
        return $resultVo;
    }

    public function getCode(): string
    {
        return $this->code;
    }

    public function getMsg(): string
    {
        return $this->msg;
    }

    /*
     * 泛型
     */
    public function getData()
    {
        return $this->data;
    }

}


/**GtxyResponseMap-success
 * agetId
 * [string]
 * 是    机构编号        展开
 * threeOrderNo
 * [string]
 * 是    第三方订单号（服务商订单号）        展开
 * netrAmt
 * [string]
 * 是    商户实收金额    单位分，原订单交易金额-官方商户出资金额-商户交易实收手续费    展开
 * txamt
 * [string]
 * 是    原订单交易金额    单位分    展开
 * custFee
 * [string]
 * 是    商户交易实收手续费    单位分    展开
 * oldFee
 * [string]
 * 是    应收手续费    单位分    展开
 * discountFee
 * [string]
 * 是    优惠手续费    单位分    展开
 * custAmt
 * [string]
 * -    商户出资金额    单位分。交易为微信时，若该值为空或0，可查看promotion_detail。数币交易时，该值为优惠金额    展开
 * wxAgetSubsidy
 * [string]
 * -    官方出资金额    单位分。交易为微信时，若该值为空或0、可查看promotion detail    展开
 * otherAmt
 * [string]
 * -    其他出资    单位分。1、交易为支付宝时，其他出资方出资金额。可能是支付宝，可能是品牌商，或者其他方，也可能是他们的共同出资。2、交易为微信时，若该值为空，可查看promotion_detail    展开
 * orderNo
 * [string]
 * 是    国通平台订单号        展开
 * torderNo
 * [string]
 * 是    官方订单号，支付渠道的官方订单号    微信/支付宝（目的通道流水号），银联（官方订单号）可用于退款    展开
 * openId
 * [string]
 * -    消费者openid    subAppid对应的消费者openid。微信交易返回openid，支付宝交易返回userId    展开
 * subOpenId
 * [string]
 * -    微信子公众号消费者openid    微信独有字段    展开
 * tradingIp
 * [string]
 * 是    交易ip        展开
 * orderTime
 * [string]
 * 是    订单完成时间    yyyyMMddHHmmss    展开
 * cardType
 * [string]
 * -    卡类型    01借记卡、 02贷记卡、03其他    展开
 * discountFlag
 * [string]
 * -    补贴类型    0无、1机构补贴、2公司补贴、11落地机构补贴    展开
 * serverThreeOrderNo
 * [string]
 * -    POS服务化第三方订单号    用于国通设备，非接口交易时，异步订单生成    展开
 * bankCode
 * [string]
 * -    银行英文缩写        展开
 * bankName
 * [string]
 * -    银行名称        展开
 * payNo
 * [string]
 * -    支付通道官方订单号        展开
 * promotionDetail
 * [string]
 * -    微信支付宝单品优惠信息        展开
 * acqAddnData
 * [string]
 * -    银联单品优惠信息        展开
 * actualPayAmt
 */